<?php
namespace App\Services;

use App\Models\Category;

class CategoryService {
    // 这是一个递归方法
    // $parentId 参数代表要获取子类目的父类目ID,null 代表获取所有根类目
    // $allCategories 参数代表数据库中所有的类目，如果是 null 代表需要从数据库中查询
    // map 的递归方法需要好好学习下。
    public function getCategoryTree($parentId = null,$allCategories = null) {
        if(is_null($allCategories)) {
            // 从数据库中一次性取出所有类目
            $allCategories = Category::all();
        }

        return $allCategories
            // 从所有类目中挑选出父类目ID 为$parentId 的类目
            ->where('parent_id',$parentId)
            // 遍历这些类目，并用返回值构件一个新的集合
            ->map(function (Category $category) use ($allCategories) {
                $data = [
                    'id' => $category->id,
                    'name' => $category->name
                ];
                // 如果当前类目不是父类目，则直接返回
                if(!$category->is_directory) {
                    return $data;
                }
                // 否则递归调用本方法，将返回值放入children 字段中
                $data['children'] = $this->getCategoryTree($category->id,$allCategories);
                return $data;
            });
    }
}